import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'
import './assets/css/global.css'

Vue.config.productionTip = false
Vue.use(ElementUI, { size: 'small' })

// 配置axios
axios.defaults.baseURL = process.env.VUE_APP_API_BASE_URL || 'http://localhost:5000/api'
axios.defaults.timeout = process.env.VUE_APP_API_TIMEOUT || 30000
Vue.prototype.$http = axios

// 添加全局消息提示方法
Vue.prototype.$successMessage = message => {
  ElementUI.Message({
    message,
    type: 'success',
    duration: 2000
  })
}

Vue.prototype.$errorMessage = message => {
  ElementUI.Message({
    message,
    type: 'error',
    duration: 2000
  })
}

// 添加全局音频URL生成方法
Vue.prototype.$getAudioUrl = (audioPath) => {
  if (!audioPath) return '';
  if (audioPath.startsWith('http')) return audioPath;
  
  // 检查是否是ID或路径
  if (typeof audioPath === 'number' || !isNaN(parseInt(audioPath))) {
    // 如果是ID，使用download接口
    return `${axios.defaults.baseURL}/admin/recordings/download/${audioPath}`;
  }
  
  // 从文件路径中提取ID信息
  // 例如: /storage/recordings/user_3_sentence_1.wav -> 提取句子ID 1
  const match = audioPath.match(/user_\d+_sentence_(\d+)\.wav$/);
  if (match && match[1]) {
    // 如果能从文件名中提取句子ID，使用句子ID访问
    const sentenceId = match[1];
    return `${axios.defaults.baseURL}/admin/recordings/download/${sentenceId}`;
  }
  
  // 否则，假设是文件路径
  // 去除开头的斜杠，避免双斜杠问题
  const path = audioPath.startsWith('/') ? audioPath.substring(1) : audioPath;
  
  // 返回默认下载URL
  return `${axios.defaults.baseURL}/admin/recordings/download/${path}`;
};

// 请求拦截器
axios.interceptors.request.use(config => {
  // 添加请求日志
  console.log('🚀 发送请求:', {
    url: config.url,
    method: config.method.toUpperCase(),
    baseURL: config.baseURL,
    headers: config.headers,
    params: config.params,
    data: config.data
  })
  
  // 移除CORS相关头，这应该由后端设置
  // config.headers['Access-Control-Allow-Origin'] = '*';
  
  const token = store.getters.token
  if (token) {
    // 确保token格式正确，后端API可能需要特定格式的Authorization头
    config.headers['Authorization'] = `Bearer ${token}`
    console.log('添加token到请求头:', token)
  } else {
    console.log('请求未携带token，可能导致认证失败')
  }
  
  // 如果是音频文件请求，设置responseType为blob
  if (config.url.includes('/recordings/download/') || config.url.includes('/recordings/file/')) {
    config.responseType = 'blob';
    console.log('设置音频请求responseType为blob');
  }
  
  return config
}, error => {
  // 请求错误处理
  console.error('❌ 请求错误:', error)
  return Promise.reject(error)
})

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // 添加响应成功日志
    console.log('✅ 响应成功:', {
      url: response.config.url,
      method: response.config.method.toUpperCase(),
      status: response.status,
      statusText: response.statusText,
      data: response.data
    })
    return response
  },
  error => {
    // 添加响应错误日志
    console.error('❌ 响应错误:', {
      url: error.config?.url,
      method: error.config?.method?.toUpperCase(),
      status: error.response?.status,
      statusText: error.response?.statusText,
      data: error.response?.data,
      message: error.message
    })
    
    if (error.response && error.response.status === 401) {
      store.dispatch('logout')
      // 避免重复导航到登录页
      if (router.currentRoute.path !== '/login') {
        router.push('/login').catch(err => {
          // 忽略NavigationDuplicated错误
          if (err.name !== 'NavigationDuplicated') {
            console.error('路由导航错误:', err)
          }
        })
      }
      Vue.prototype.$errorMessage('登录已过期，请重新登录')
    } else if (error.response && error.response.data && error.response.data.message) {
      Vue.prototype.$errorMessage(error.response.data.message)
    } else {
      Vue.prototype.$errorMessage('网络错误，请稍后重试')
    }
    return Promise.reject(error)
  }
)

// 在应用启动前验证token
async function initApp() {
  // 如果有token，先验证其有效性
  if (store.getters.token) {
    console.log('应用启动: 检测到已有token，正在验证...')
    try {
      // 尝试验证token
      await store.dispatch('validateToken')
    } catch (error) {
      console.error('Token验证失败，将重定向到登录页')
      // 验证失败会在validateToken中清除token
    }
  } else {
    console.log('应用启动: 未检测到token')
  }
  
  // 创建并挂载Vue实例
  new Vue({
    router,
    store,
    render: h => h(App)
  }).$mount('#app')
}

// 启动应用
initApp()
